package busterminal.command.scheduleditem;

import busterminal.command.AbstractCommand;
import busterminal.entity.service.Time;
import busterminal.exception.BusinessException;
import busterminal.persistence.ScheduledItemDAO;
import busterminal.services.ServiceLocator;
import java.util.Arrays;
import java.util.List;

/**
 * Команда для поиска пунктов расписания, попадающих в заданный временной интервал
 */
public class FindScheduledItemByTimeCommand extends AbstractCommand {

    /**
     * Имя параметра "Временной интервал до текущего момента"
     */
    private final static String PARAM_AMOUNT_BEFORE = "time before current (in HH:MM format)";
    /**
     * Имя параметра "Временной интервал после текущего момента"
     */
    private final static String PARAM_AMOUNT_AFTER = "time after current (in HH:MM format)";
    /**
     * Регулярное выражение для проверки корректности ввода времени в формате
     * <code>HH:MM</code>
     */
    private static final String CORRECT_TIME_FORMAT = "^(([0-1][0-9])|([2][0-3])):([0-5][0-9])$";

    /**
     * Конструктор по умолчанию
     */
    public FindScheduledItemByTimeCommand() {
        super("Find scheduled item by time");
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_AMOUNT_BEFORE, PARAM_AMOUNT_AFTER);
    }

    /**
     * Выполнить команду
     */
    @Override
    public void execute() {
        if (!parameters.get(PARAM_AMOUNT_BEFORE).trim().matches(CORRECT_TIME_FORMAT)) {
            throw new BusinessException("Incorrect time '" + parameters.get(PARAM_AMOUNT_BEFORE).trim() + "'");
        }
        if (!parameters.get(PARAM_AMOUNT_AFTER).trim().matches(CORRECT_TIME_FORMAT)) {
            throw new BusinessException("Incorrect time '" + parameters.get(PARAM_AMOUNT_AFTER).trim() + "'");
        }

        ScheduledItemDAO scheduledItemDAO = ServiceLocator.getService(ScheduledItemDAO.class);
        System.out.println(scheduledItemDAO.findByTime(Time.parseTime(parameters.get(PARAM_AMOUNT_BEFORE).trim()), Time.parseTime(parameters.get(PARAM_AMOUNT_AFTER).trim())));
    }
}
